package main
import (
	"fmt"
    "unicode/utf8"
)

//  14. 字符串
func main(){

    name := "Hello World"
    fmt.Println(name)
    printBytes(name)
    fmt.Printf("\n")
    printChars(name)
    // 存在错误 然看起来是合法的，但却有一个严重的 bug。
    name = "Señor"
    fmt.Printf("\n")
    printBytes(name)
    fmt.Printf("\n")
    printChars(name)

    // rune 是 Go 语言的内建类型

    // 字符串的 for range 循环
    printCharsAndBytes(name)

    // 用字节切片构造字符串
    byteSlice := []byte{0x43, 0x61, 0x66, 0xC3, 0xA9}
    byteSlice1 := []byte{67, 97, 102, 195, 169} //16 进制换成对应的 10 进制值
    str := string(byteSlice)
    str1 := string(byteSlice1)
    fmt.Println("\n",str)
    fmt.Println(str1)

    // 用 rune 切片构造字符串
    runeSlice := []rune{0x0053, 0x0065, 0x00f1, 0x006f, 0x0072}
    str3 := string(runeSlice)
    fmt.Println("\n",str3)

    // 字符串的长度 utf8.RuneCountInString(s)
    fmt.Println("\n 长度 str1= ", str1, utf8.RuneCountInString(str1))
    fmt.Println("长度 str3= ", str3, utf8.RuneCountInString(str3))

    // 为了修改字符串，可以把字符串转化为一个 rune 切片
    h := "hello"
    fmt.Println(mutate([]rune(h)))



}

// 单独获取字符串的每一个字节 些打印出来的字符是 "Hello World" 以 Unicode UTF-8 编码的结果  48 65 6c 6c 6f 20 57 6f 72 6c 64 
func printBytes(s string) {
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
}
// 让它打印字符串的每一个字符。
func printChars(s string) {
    runes := []rune(s)   // rune 是 Go 语言的内建类型
    for i := 0; i < len(runes); i++{
        fmt.Printf("%c ", runes[i])
    }
}
// 字符串的 for range 循环
func printCharsAndBytes(s string) {
    for index, rune := range s {
        fmt.Printf("%c starts at byte %d \n", rune, index)
    } 
}

// 为了修改字符串，可以把字符串转化为一个 rune 切片
func mutate(s []rune) string {
    s[0] = 'a'
    return string(s)
}